package offer2

/*
https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/

剑指offer 30  包含min函数的栈
定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中，调用 min、push 及 pop 的时间复杂度都是 O(1)。
*/

type MinNode struct {
	nums []int
	min  []int
}

var m *MinNode = NewMinNode()

func NewMinNode() *MinNode {
	return &MinNode{
		nums: make([]int, 0),
		min:  make([]int, 0),
	}
}

func Push(x int) {
	m.nums = append(m.nums, x) //存入元素 普通数组, 直接存入即可

	//最小栈数组: 如果最小栈为空,直接存入即可 如果不为空, 直接存入栈顶元素和当前元素的最小值
	if len(m.min) == 0 {
		m.min = append(m.min, x)
	} else {
		m.min = append(m.min, min(m.min[len(m.min)-1], x))
	}
}

func Pop() {
	//弹出元素 都直接弹出即可
	m.nums = m.nums[:len(m.nums)-1]
	m.min = m.min[:len(m.min)-1]
}

func Top() int {
	return m.nums[len(m.nums)-1] //获取栈顶元素
}

func Min() int {
	return m.min[len(m.min)-1] //获取最小值
}
